<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title></title>
	<script type="text/javascript" src="js/d3.min.js"></script>
	<script type="text/javascript" src="js/strucMap.min.js"></script>
	<link rel="stylesheet" href="css/strucMap.min.css" />

</head>

<body>
	<div id="title">后端架构师技术栈知识图谱</div>
	<div id="topomap" style="margin: 0 auto;"></div>
	<script type="text/javascript">

		var nodePX = 0;
		var nodePY = 0;

		var options = {
			selector: "#topomap",
			width: 1440,//实际展开图宽度
			height: 1440,//实际展开图高度
			lineLength: 100,
//	        textColor:"#000",
//	        textFontFamily:'',
			nodesClick: function (t) {
				//if(t.index==0) t.fixed=1;//判断如果是第一级，移动后就将它固定
				t.fixed = 1;
				console.log(t);
				var nodeX = JSON.parse(JSON.stringify(t.x));
				var nodeY = JSON.parse(JSON.stringify(t.y));
				//xy都没有变，说明没有拖动
				if ((nodeX == nodePX) && (nodeY == nodePY)) {
					console.info("跳页面啦~~~~~~");
				}
			},
			nodesDragstart: function (t) {
				nodePX = JSON.parse(JSON.stringify(t.x));
				nodePY = JSON.parse(JSON.stringify(t.y));
				//console.log("移动开始",JSON.parse(JSON.stringify(t.x)),JSON.parse(JSON.stringify(t.y)));
			}
		};

		var nodesJson = [
		{ "fixed": true, "id": 0, "index": 0, "prop": { "name": "后端架构师技术图谱", "size": 32, "nTxt": "76%" }, "x": 724, "y": 616 },
		{ "id": 1, "index": 1, "prop": { "name": "数据结构", "size": 25, "nTxt": "120" } },
		{ "id": 2, "index": 1, "prop": { "name": "常用算法", "size": 25, "nTxt": "90" } },
		{ "id": 3, "index": 1, "prop": { "name": "并发", "size": 25 } },
		{ "id": 4, "index": 1, "prop": { "name": "操作系统", "size": 25 } },
		{ "id": 5, "index": 1, "prop": { "name": "设计模式", "size": 25 } },
		{ "id": 6, "index": 1, "prop": { "name": "运维", "size": 25 } },
		{ "id": 7, "index": 1, "prop": { "name": "中间件", "size": 25 } },
		{ "id": 8, "index": 1, "prop": { "name": "网络", "size": 25 } },
		{ "id": 9, "index": 1, "prop": { "name": "数据库", "size": 25 } },
		{ "id": 10, "index": 1, "prop": { "name": "搜索引擎", "size": 25 } },
		{ "id": 11, "index": 1, "prop": { "name": "性能优化", "size": 25 } },
		{ "id": 12, "index": 1, "prop": { "name": "大数据", "size": 25 } },
		{ "id": 13, "index": 1, "prop": { "name": "安全", "size": 25 } },
		{ "id": 14, "index": 1, "prop": { "name": "常用开源框架", "size": 25 } },
		{ "id": 15, "index": 1, "prop": { "name": "分布式设计", "size": 25 } },
		{ "id": 16, "index": 1, "prop": { "name": "设计思想&开发模式", "size": 25 } },
		{ "id": 17, "index": 1, "prop": { "name": "项目管理", "size": 25 } },

		{ "id": 18, "index": 2, "prop": { "name": "队列", "size": 15 } },
		{ "id": 19, "index": 2, "prop": { "name": "集合", "size": 15 } },
		{ "id": 20, "index": 2, "prop": { "name": "链表、数组", "size": 15 } },
		{ "id": 21, "index": 2, "prop": { "name": "字典、关联数组", "size": 15 } },
		{ "id": 22, "index": 2, "prop": { "name": "栈", "size": 15 } },
		{ "id": 23, "index": 2, "prop": { "name": "树", "size": 15 } },
		{ "id": 24, "index": 2, "prop": { "name": "BitSet", "size": 15 } },

		{ "id": 25, "index": 2, "prop": { "name": "排序、查找算法", "size": 15 } },
		{ "id": 26, "index": 2, "prop": { "name": "布隆过滤器", "size": 15 } },
		{ "id": 27, "index": 2, "prop": { "name": "字符串比较", "size": 15 } },
		{ "id": 28, "index": 2, "prop": { "name": "深度优先、广度优先", "size": 15 } },
		{ "id": 29, "index": 2, "prop": { "name": "贪心算法", "size": 15 } },
		{ "id": 30, "index": 2, "prop": { "name": "回溯算法", "size": 15 } },
		{ "id": 31, "index": 2, "prop": { "name": "剪枝算法", "size": 15 } },
		{ "id": 32, "index": 2, "prop": { "name": "动态规划", "size": 15 } },
		{ "id": 33, "index": 2, "prop": { "name": "朴素贝叶斯", "size": 15 } },
		{ "id": 34, "index": 2, "prop": { "name": "推荐算法", "size": 15 } },
		{ "id": 35, "index": 2, "prop": { "name": "最小生成树算法", "size": 15 } },
		{ "id": 36, "index": 2, "prop": { "name": "最短路径算法", "size": 15 } },

		{ "id": 37, "index": 2, "prop": { "name": "Java 并发", "size": 15 } },
		{ "id": 38, "index": 2, "prop": { "name": "多线程", "size": 15 } },
		{ "id": 39, "index": 2, "prop": { "name": "线程安全", "size": 15 } },
		{ "id": 40, "index": 2, "prop": { "name": "一致性、事务", "size": 15 } },
		{ "id": 41, "index": 2, "prop": { "name": "锁", "size": 15 } },


		{ "id": 42, "index": 2, "prop": { "name": "计算机原理", "size": 15 } },
		{ "id": 43, "index": 2, "prop": { "name": "CPU", "size": 15 } },
		{ "id": 44, "index": 2, "prop": { "name": "进程", "size": 15 } },
		{ "id": 45, "index": 2, "prop": { "name": "线程", "size": 15 } },
		{ "id": 46, "index": 2, "prop": { "name": "协程", "size": 15 } },
		{ "id": 47, "index": 2, "prop": { "name": "Linux", "size": 15 } },

		{ "id": 48, "index": 2, "prop": { "name": "设计模式的六大原则", "size": 15 } },
		{ "id": 49, "index": 2, "prop": { "name": "23种常见设计模式", "size": 15 } },
		{ "id": 50, "index": 2, "prop": { "name": "应用场景", "size": 15 } },
		{ "id": 51, "index": 2, "prop": { "name": "单例模式", "size": 15 } },
		{ "id": 52, "index": 2, "prop": { "name": "责任链模式", "size": 15 } },
		{ "id": 53, "index": 2, "prop": { "name": "MVC", "size": 15 } },
		{ "id": 54, "index": 2, "prop": { "name": "IOC", "size": 15 } },
		{ "id": 55, "index": 2, "prop": { "name": "AOP", "size": 15 } },
		{ "id": 56, "index": 2, "prop": { "name": "UML", "size": 15 } },
		{ "id": 57, "index": 2, "prop": { "name": "微服务思想", "size": 15 } },

		{ "id": 58, "index": 2, "prop": { "name": "常规监控", "size": 15 } },
		{ "id": 59, "index": 2, "prop": { "name": "APM", "size": 15 } },
		{ "id": 60, "index": 2, "prop": { "name": "持续集成(CI/CD)", "size": 15 } },
		{ "id": 61, "index": 2, "prop": { "name": "自动化运维", "size": 15 } },
		{ "id": 62, "index": 2, "prop": { "name": "测试", "size": 15 } },
		{ "id": 63, "index": 2, "prop": { "name": "虚拟化", "size": 15 } },
		{ "id": 64, "index": 2, "prop": { "name": "容器技术", "size": 15 } },
		{ "id": 65, "index": 2, "prop": { "name": "云技术", "size": 15 } },
		{ "id": 66, "index": 2, "prop": { "name": "统计分析", "size": 15 } },
		{ "id": 67, "index": 2, "prop": { "name": "DevOps", "size": 15 } },
		{ "id": 68, "index": 2, "prop": { "name": "文档管理", "size": 15 } },


		{ "id": 69, "index": 2, "prop": { "name": "Web Server", "size": 15 } },
		{ "id": 70, "index": 2, "prop": { "name": "缓存", "size": 15 } },
		{ "id": 71, "index": 2, "prop": { "name": "客户端缓存", "size": 15 } },
		{ "id": 72, "index": 2, "prop": { "name": "服务端缓存", "size": 15 } },
		{ "id": 73, "index": 2, "prop": { "name": "消息队列", "size": 15 } },
		{ "id": 74, "index": 2, "prop": { "name": "定时调度", "size": 15 } },
		{ "id": 75, "index": 2, "prop": { "name": "数据库中间件", "size": 15 } },
		{ "id": 76, "index": 2, "prop": { "name": "日志系统", "size": 15 } },
		{ "id": 77, "index": 2, "prop": { "name": "配置中心", "size": 15 } },
		{ "id": 78, "index": 2, "prop": { "name": "日志系统", "size": 15 } },
		{ "id": 79, "index": 2, "prop": { "name": "API 网关", "size": 15 } },

		{ "id": 80, "index": 2, "prop": { "name": "协议", "size": 15 } },
		{ "id": 81, "index": 2, "prop": { "name": "网络模型", "size": 15 } },
		{ "id": 82, "index": 2, "prop": { "name": "连接和短连接", "size": 15 } },
		{ "id": 83, "index": 2, "prop": { "name": "框架", "size": 15 } },
		{ "id": 84, "index": 2, "prop": { "name": "零拷贝（Zero-copy）", "size": 15 } },
		{ "id": 85, "index": 2, "prop": { "name": "序列化(二进制协议)", "size": 15 } },

		{ "id": 86, "index": 2, "prop": { "name": "基础理论", "size": 15 } },
		{ "id": 87, "index": 2, "prop": { "name": "MySQL", "size": 15 } },
		{ "id": 88, "index": 2, "prop": { "name": "Oracle", "size": 15 } },
		{ "id": 90, "index": 2, "prop": { "name": "NoSQL", "size": 15 } },

		{ "id": 91, "index": 2, "prop": { "name": "搜索引擎原理", "size": 15 } },
		{ "id": 92, "index": 2, "prop": { "name": "Lucene", "size": 15 } },
		{ "id": 93, "index": 2, "prop": { "name": "Elasticsearch", "size": 15 } },
		{ "id": 94, "index": 2, "prop": { "name": "Solr", "size": 15 } },
		{ "id": 95, "index": 2, "prop": { "name": "sphinx", "size": 15 } },

		{ "id": 96, "index": 2, "prop": { "name": "性能优化方法论", "size": 15 } },
		{ "id": 97, "index": 2, "prop": { "name": "容量评估", "size": 15 } },
		{ "id": 98, "index": 2, "prop": { "name": "CDN 网络", "size": 15 } },
		{ "id": 99, "index": 2, "prop": { "name": "连接池", "size": 15 } },
		{ "id": 100, "index": 2, "prop": { "name": "性能调优", "size": 15 } },

		{ "id": 101, "index": 2, "prop": { "name": "流式计算", "size": 15 } },
		{ "id": 102, "index": 2, "prop": { "name": "Hadoop", "size": 15 } },
		{ "id": 103, "index": 2, "prop": { "name": "Spark", "size": 15 } },


		{ "id": 104, "index": 2, "prop": { "name": "web 安全", "size": 15 } },
		{ "id": 105, "index": 2, "prop": { "name": "WDDoS 防范", "size": 15 } },
		{ "id": 106, "index": 2, "prop": { "name": "用户隐私信息保护", "size": 15 } },
		{ "id": 107, "index": 2, "prop": { "name": "序列化漏洞", "size": 15 } },
		{ "id": 108, "index": 2, "prop": { "name": "加密解密", "size": 15 } },
		{ "id": 109, "index": 2, "prop": { "name": "服务器安全", "size": 15 } },
		{ "id": 110, "index": 2, "prop": { "name": "数据安全", "size": 15 } },
		{ "id": 111, "index": 2, "prop": { "name": "网络隔离", "size": 15 } },
		{ "id": 112, "index": 2, "prop": { "name": "授权、认证", "size": 15 } },

		{ "id": 113, "index": 2, "prop": { "name": "开源协议", "size": 15 } },
		{ "id": 114, "index": 2, "prop": { "name": "日志框架", "size": 15 } },
		{ "id": 115, "index": 2, "prop": { "name": "ORM", "size": 15 } },
		{ "id": 116, "index": 2, "prop": { "name": "网络框架", "size": 15 } },
		{ "id": 117, "index": 2, "prop": { "name": "Web 框架", "size": 15 } },
		{ "id": 118, "index": 2, "prop": { "name": "工具框架", "size": 15 } },



		{ "id": 119, "index": 2, "prop": { "name": "扩展性设计", "size": 15 } },
		{ "id": 120, "index": 2, "prop": { "name": "稳定性&高可用", "size": 15 } },
		{ "id": 121, "index": 2, "prop": { "name": "数据库扩展", "size": 15 } },
		{ "id": 122, "index": 2, "prop": { "name": "服务治理", "size": 15 } },
		{ "id": 123, "index": 2, "prop": { "name": "分布式一致", "size": 15 } },
		{ "id": 124, "index": 2, "prop": { "name": "分布式文件系统", "size": 15 } },
		{ "id": 125, "index": 2, "prop": { "name": "唯一ID生成", "size": 15 } },
		{ "id": 126, "index": 2, "prop": { "name": "一致性Hash算法", "size": 15 } },

		{ "id": 127, "index": 2, "prop": { "name": "DDD(Domain-driven Design - 领域驱动设计", "size": 15 } },
		{ "id": 128, "index": 2, "prop": { "name": "Actor 模式", "size": 15 } },
		{ "id": 115, "index": 2, "prop": { "name": "响应式编程", "size": 15 } },
		{ "id": 130, "index": 2, "prop": { "name": "分布式文件系统", "size": 15 } },
		{ "id": 131, "index": 2, "prop": { "name": "DODAF2.0", "size": 15 } },
		{ "id": 132, "index": 2, "prop": { "name": "Serverless", "size": 15 } },
		{ "id": 133, "index": 2, "prop": { "name": "Service Mesh", "size": 15 } },


		{ "id": 134, "index": 2, "prop": { "name": "架构评审", "size": 15 } },
		{ "id": 135, "index": 2, "prop": { "name": "重构", "size": 15 } },
		{ "id": 136, "index": 2, "prop": { "name": "代码规范", "size": 15 } },
		{ "id": 137, "index": 2, "prop": { "name": "代码 Review", "size": 15 } },
		{ "id": 138, "index": 2, "prop": { "name": "RUP", "size": 15 } },
		{ "id": 139, "index": 2, "prop": { "name": "看板管理", "size": 15 } },
		{ "id": 140, "index": 2, "prop": { "name": "SCRUM", "size": 15 } },
		{ "id": 141, "index": 2, "prop": { "name": "敏捷开发", "size": 15 } },
		{ "id": 142, "index": 2, "prop": { "name": "极限编程（XP）", "size": 15 } },
		{ "id": 143, "index": 2, "prop": { "name": "结对编程", "size": 15 } },
		{ "id": 144, "index": 2, "prop": { "name": "PDCA 循环质量管理", "size": 15 } },
		{ "id": 145, "index": 2, "prop": { "name": "FMEA管理模式", "size": 15 } },






		];
		//source和target都是按照数组的顺序来的，下标
		var linksJson = [
			{ "source": 0, "target": 1, },
			{ "source": 0, "target": 2, },
			{ "source": 0, "target": 3, },
			{ "source": 0, "target": 4, },
			{ "source": 0, "target": 5, },
			{ "source": 0, "target": 6, },
			{ "source": 0, "target": 7, },
			{ "source": 0, "target": 8, },
			{ "source": 0, "target": 9, },
			{ "source": 0, "target": 10, },
			{ "source": 0, "target": 11, },
			{ "source": 0, "target": 12, },
			{ "source": 0, "target": 13, },
			{ "source": 0, "target": 14, },
			{ "source": 0, "target": 15, },
			{ "source": 0, "target": 16, },
			{ "source": 0, "target": 17, },

			{ "source": 1, "target": 18, },
			{ "source": 1, "target": 19, },
			{ "source": 1, "target": 20, },
			{ "source": 1, "target": 21, },
			{ "source": 1, "target": 22, },
			{ "source": 1, "target": 23, },
			{ "source": 1, "target": 24, },

			{ "source": 2, "target": 25, },
			{ "source": 2, "target": 26, },
			{ "source": 2, "target": 27, },
			{ "source": 2, "target": 28, },
			{ "source": 2, "target": 29, },
			{ "source": 2, "target": 30, },
			{ "source": 2, "target": 31, },
			{ "source": 2, "target": 32, },
			{ "source": 2, "target": 33, },
			{ "source": 2, "target": 34, },
			{ "source": 2, "target": 35, },
			{ "source": 2, "target": 36, },

			{ "source": 3, "target": 37, },
			{ "source": 3, "target": 38, },
			{ "source": 3, "target": 39, },
			{ "source": 3, "target": 40, },
			{ "source": 3, "target": 41, },

			{ "source": 4, "target": 42, },
			{ "source": 4, "target": 43, },
			{ "source": 4, "target": 44, },
			{ "source": 4, "target": 45, },
			{ "source": 4, "target": 46, },
			{ "source": 4, "target": 47, },

			{ "source": 5, "target": 48, },
			{ "source": 5, "target": 49, },
			{ "source": 5, "target": 50, },
			{ "source": 5, "target": 51, },
			{ "source": 5, "target": 52, },
			{ "source": 5, "target": 53, },
			{ "source": 5, "target": 54, },
			{ "source": 5, "target": 55, },
			{ "source": 5, "target": 56, },
			{ "source": 5, "target": 57, },
			{ "source": 6, "target": 58, },
			{ "source": 6, "target": 59, },
			{ "source": 6, "target": 60, },
			{ "source": 6, "target": 61, },
			{ "source": 6, "target": 62, },
			{ "source": 6, "target": 63, },
			{ "source": 6, "target": 64, },
			{ "source": 6, "target": 65, },
			{ "source": 6, "target": 66, },
			{ "source": 6, "target": 67, },
			{ "source": 6, "target": 68, },
			{ "source": 7, "target": 69, },
			{ "source": 7, "target": 70, },
			{ "source": 7, "target": 71, },
			{ "source": 7, "target": 72, },
			{ "source": 7, "target": 73, },
			{ "source": 7, "target": 74, },
			{ "source": 7, "target": 75, },
			{ "source": 7, "target": 76, },
			{ "source": 7, "target": 77, },
			{ "source": 7, "target": 78, },
			{ "source": 7, "target": 79, },
			{ "source": 8, "target": 80, },
			{ "source": 8, "target": 81, },
			{ "source": 8, "target": 82, },
			{ "source": 8, "target": 83, },
			{ "source": 8, "target": 84, },
			{ "source": 8, "target": 85, },
			{ "source": 9, "target": 86, },
			{ "source": 9, "target": 87, },
			{ "source": 9, "target": 88, },
			{ "source": 9, "target": 89, },
			{ "source": 9, "target": 90, },

			{ "source": 10, "target": 91, },
			{ "source": 10, "target": 92, },
			{ "source": 10, "target": 93, },
			{ "source": 10, "target": 94, },
			{ "source": 10, "target": 95, },

			{ "source": 11, "target": 96, },
			{ "source": 11, "target": 97, },
			{ "source": 11, "target": 98, },
			{ "source": 11, "target": 99, },
			{ "source": 11, "target": 100, },

			{ "source": 12, "target": 101, },
			{ "source": 12, "target": 102, },
			{ "source": 12, "target": 103, },

			{ "source": 13, "target": 104, },
			{ "source": 13, "target": 105, },
			{ "source": 13, "target": 106, },
			{ "source": 13, "target": 107, },
			{ "source": 13, "target": 108, },
			{ "source": 13, "target": 109, },
			{ "source": 13, "target": 110, },
			{ "source": 13, "target": 111, },
			{ "source": 13, "target": 112, },

			{ "source": 14, "target": 113, },
			{ "source": 14, "target": 114, },
			{ "source": 14, "target": 115, },
			{ "source": 14, "target": 116, },
			{ "source": 14, "target": 117, },
			{ "source": 14, "target": 118, },

			{ "source": 15, "target": 119, },
			{ "source": 15, "target": 120, },
			{ "source": 15, "target": 121, },
			{ "source": 15, "target": 122, },
			{ "source": 15, "target": 123, },
			{ "source": 15, "target": 124, },
			{ "source": 15, "target": 125, },
			{ "source": 15, "target": 126, },

			{ "source": 16, "target": 127, },
			{ "source": 16, "target": 128, },
			{ "source": 16, "target": 129, },
			{ "source": 16, "target": 130, },
			{ "source": 16, "target": 131, },
			{ "source": 16, "target": 132, },
			{ "source": 16, "target": 133, },

			{ "source": 17, "target": 134, },
			{ "source": 17, "target": 135, },
			{ "source": 17, "target": 136, },
			{ "source": 17, "target": 137, },
			{ "source": 17, "target": 138, },
			{ "source": 17, "target": 139, },
			{ "source": 17, "target": 140, },
			{ "source": 17, "target": 141, },
			{ "source": 17, "target": 142, },
			{ "source": 17, "target": 143, },
			{ "source": 17, "target": 144, }


		];

		console.log("初始化打印", linksJson);
		loadMap(options, nodesJson, linksJson);
	</script>
</body>

</html>